module hip.api.systems.timer;

enum HipTimerType
{
    oneShot,
    progressive
}

alias HipTimerCallback = void delegate(float progress, uint loopCount);

interface IHipTimer
{
    string getName();
    float getDuration();
    float getProgress();

    final bool hasFinished(){return getProgress() == 1.0f;}
    IHipTimer addHandler(void delegate() handler);
    IHipTimer addHandler(void delegate(float progress) handler);
    IHipTimer addHandler(HipTimerCallback handler);
    void forceFinish();
    void stop();
    void pause();
    ///Remember to call "play" for setting it up to tick
    IHipTimer play();
    void reset();
    void loopRestart();
    ///Returns wether it has finished
    bool tick(float deltaTime);
}

interface IHipFiniteTask
{
    IHipFiniteTask addOnFinish(void delegate() onFinish);
}

interface IHipTimerList : IHipFiniteTask
{
    IHipTimerList add(IHipTimer timer);
}